﻿/*
 kkpager V1.2.2
 一个分页展示按钮控件
 https://github.com/pgkk/kkpager

 Copyright (c) 2013 cqzhangkang@163.com
 Licensed under the GNU GENERAL PUBLIC LICENSE
 */

define(function (require, exports, module) {

    require('/plugins/commonPlugins/pager/pager.css');

    var kkpager = {
        pagerid: 'kkpager', //divID
        mode: 'link', //模式(link 或者 click)
        pno: 1, //当前页码
        total: 1, //总页码
        totalRecords: 0, //总数据条数
        isShowFirstPageBtn: true, //是否显示首页按钮
        isShowLastPageBtn: true, //是否显示尾页按钮
        isShowPrePageBtn: true, //是否显示上一页按钮
        isShowNextPageBtn: true, //是否显示下一页按钮
        isShowTotalPage: true, //是否显示总页数
        isShowTotalRecords: true, //是否显示总记录数
        isGoPage: true,	//是否显示页码跳转输入框
        hrefFormer: '', //链接前部
        hrefLatter: '', //链接尾部
        gopageWrapId: 'kkpager_gopage_wrap',
        gopageButtonId: 'kkpager_btn_go',
        gopageTextboxId: 'kkpager_btn_go_input',
        lang: {
            firstPageText: '首页',
            firstPageTipText: '首页',
            lastPageText: '尾页',
            lastPageTipText: '尾页',
            prePageText: '上一页',
            prePageTipText: '上一页',
            nextPageText: '下一页',
            nextPageTipText: '下一页',
            totalPageBeforeText: '共',
            totalPageAfterText: '页',
            totalRecordsAfterText: '条数据',
            gopageBeforeText: '转到',
            gopageButtonOkText: '确定',
            gopageAfterText: '页',
            buttonTipBeforeText: '第',
            buttonTipAfterText: '页'
        },
        //链接算法（当处于link模式）,参数n为页码
        getLink: function (n) {
            //这里的算法适用于比如：
            //hrefFormer=http://www.xx.com/news/20131212
            //hrefLatter=.html
            //那么首页（第1页）就是http://www.xx.com/news/20131212.html
            //第2页就是http://www.xx.com/news/20131212_2.html
            //第n页就是http://www.xx.com/news/20131212_n.html
            if (n == 1) {
                return this.hrefFormer + this.hrefLatter;
            }
            return this.hrefFormer + '_' + n + this.hrefLatter;
        },
        //页码单击事件处理函数（当处于mode模式）,参数n为页码
        click: function (n) {
            //这里自己实现
            //这里可以用this或者kkpager访问kkpager对象
            return false;
        },
        //获取href的值（当处于mode模式）,参数n为页码
        getHref: function (n) {
            //默认返回'#'
            return '#';
        },
        //跳转框得到输入焦点时
        focus_gopage: function () {
            var btnGo = $('#' + this.gopageButtonId);
            $('#' + this.gopageTextboxId).attr('hideFocus', true);
            btnGo.show();
            btnGo.css('left', '0px');
            $('#' + this.gopageWrapId).css('border-color', '#d71317');
            btnGo.animate({left: '+=44'}, 50, function () {
                //$('#'+this.gopageWrapId).css('width','88px');
            });
        },
        //跳转框失去输入焦点时
        blur_gopage: function () {
            var _this = this;
            setTimeout(function () {
                var btnGo = $('#' + _this.gopageButtonId);
                btnGo.animate({
                    left: '-=44'
                }, 100, function () {
                    btnGo.css('left', '0px');
                    btnGo.hide();
                    $('#' + _this.gopageWrapId).css('border-color', '#DFDFDF');
                });
            }, 400);
        },
        //跳转输入框按键操作
        keypress_gopage: function () {
            var event = arguments[0] || window.event;
            var code = event.keyCode || event.charCode;
            //delete key
            if (code == 8) return true;
            //enter key
            if (code == 13) {
                kkpager.gopage();
                return false;
            }
            //copy and paste
            if (event.ctrlKey && (code == 99 || code == 118)) return true;
            //only number key
            if (code < 48 || code > 57)return false;
            return true;
        },
        //跳转框页面跳转
        gopage: function () {
            var str_page = $('#' + this.gopageTextboxId).val();
            if (isNaN(str_page)) {
                $('#' + this.gopageTextboxId).val(this.next);
                return;
            }
            var n = parseInt(str_page);
            if (n < 1) n = 1;
            if (n > this.total) n = this.total;
            if (this.mode == 'click') {
                this._clickHandler(n);
            } else {
                window.location = this.getLink(n);
            }
        },
        //不刷新页面直接手动调用选中某一页码
        selectPage: function (n) {
            this._config['pno'] = n;
            this.generPageHtml(this._config, true);
        },
        //生成控件代码
        generPageHtml: function (config, enforceInit) {
            if (!this.inited || enforceInit) {
                this.init(config);
            }
            var str_first = '', str_prv = '', str_next = '', str_last = '';
            if (this.isShowFirstPageBtn) {
                if (this.hasPrv) {
                    str_first = '<a ' + this._getHandlerStr(1) + ' title="'
                        + (this.lang.firstPageTipText || this.lang.firstPageText) + '">' + this.lang.firstPageText + '</a>';
                } else {
                    str_first = '<a class="disabled" href="javascript:;">' + this.lang.firstPageText + '</a>';
                }
            }
            if (this.isShowPrePageBtn) {
                if (this.hasPrv) {
                    str_prv = '<a ' + this._getHandlerStr(this.prv) + ' title="'
                        + (this.lang.prePageTipText || this.lang.prePageText) + '">' + this.lang.prePageText + '</a>';
                } else {
                    str_prv = '<a class="disabled" href="javascript:;">' + this.lang.prePageText + '</a>';
                }
            }
            if (this.isShowNextPageBtn) {
                if (this.hasNext) {
                    str_next = '<a ' + this._getHandlerStr(this.next) + ' title="'
                        + (this.lang.nextPageTipText || this.lang.nextPageText) + '">' + this.lang.nextPageText + '</a>';
                } else {
                    str_next = '<a class="disabled" href="javascript:;">' + this.lang.nextPageText + '</a>';
                }
            }
            if (this.isShowLastPageBtn) {
                if (this.hasNext) {
                    str_last = '<a ' + this._getHandlerStr(this.total) + ' title="'
                        + (this.lang.lastPageTipText || this.lang.lastPageText) + '">' + this.lang.lastPageText + '</a>';
                } else {
                    str_last = '<a class="disabled" href="javascript:;">' + this.lang.lastPageText + '</a>';
                }
            }
            var str = '';
            var dot = '<span>...</span>';
            var total_info = '';
            if (this.isShowTotalPage || this.isShowTotalRecords) {
                total_info = '&nbsp;<span class="normalsize">' + this.lang.totalPageBeforeText;
                if (this.isShowTotalPage) {
                    total_info += this.total + this.lang.totalPageAfterText;
                    if (this.isShowTotalRecords) {
                        total_info += '/';
                    }
                }
                if (this.isShowTotalRecords) {
                    total_info += this.totalRecords + this.lang.totalRecordsAfterText;
                }

                total_info += '</span>';
            }

            var gopage_info = '';
            if (this.isGoPage) {
                gopage_info = '&nbsp;' + this.lang.gopageBeforeText + '<span id="' + this.gopageWrapId + '">' +
                    '<input type="button" id="' + this.gopageButtonId + '" onclick="kkpager.gopage()" value="'
                    + this.lang.gopageButtonOkText + '" />' +
                    '<input type="text" id="' + this.gopageTextboxId + '" onfocus="kkpager.focus_gopage()"  onkeypress="return kkpager.keypress_gopage(event);"   onblur="kkpager.blur_gopage()" value="' + this.next + '" /></span>' + this.lang.gopageAfterText;
            }

            //分页处理
            if (this.total <= 8) {
                for (var i = 1; i <= this.total; i++) {
                    if (this.pno == i) {
                        str += '<a class="curr" href="javascript:;">' + i + '</a>';
                    } else {
                        str += '<a ' + this._getHandlerStr(i) + ' title="'
                            + this.lang.buttonTipBeforeText + i + this.lang.buttonTipAfterText + '">' + i + '</a>';
                    }
                }
            } else {
                if (this.pno <= 5) {
                    for (var i = 1; i <= 7; i++) {
                        if (this.pno == i) {
                            str += '<a class="curr" href="javascript:;">' + i + '</a>';
                        } else {
                            str += '<a ' + this._getHandlerStr(i) + ' title="' +
                                this.lang.buttonTipBeforeText + i + this.lang.buttonTipAfterText + '">' + i + '</a>';
                        }
                    }
                    str += dot;
                } else {
                    str += '<a ' + this._getHandlerStr(1) + ' title="'
                        + this.lang.buttonTipBeforeText + '1' + this.lang.buttonTipAfterText + '">1</a>';
                    str += '<a ' + this._getHandlerStr(2) + ' title="'
                        + this.lang.buttonTipBeforeText + '2' + this.lang.buttonTipAfterText + '">2</a>';
                    str += dot;

                    var begin = this.pno - 2;
                    var end = this.pno + 2;
                    if (end > this.total) {
                        end = this.total;
                        begin = end - 4;
                        if (this.pno - begin < 2) {
                            begin = begin - 1;
                        }
                    } else if (end + 1 == this.total) {
                        end = this.total;
                    }
                    for (var i = begin; i <= end; i++) {
                        if (this.pno == i) {
                            str += '<a class="curr" href="javascript:;">' + i + '</a>';
                        } else {
                            str += '<a ' + this._getHandlerStr(i) + ' title="'
                                + this.lang.buttonTipBeforeText + i + this.lang.buttonTipAfterText + '">' + i + '</a>';
                        }
                    }
                    if (end != this.total) {
                        str += dot;
                    }
                }
            }

            str = "&nbsp;" + str_first + str_prv + str + str_next + str_last + total_info + gopage_info;
            $("#" + this.pagerid).html(str);
        },
        //分页按钮控件初始化
        init: function (config) {
            this._config = config;
            this.pno = isNaN(config.pno) ? 1 : parseInt(config.pno);
            this.total = isNaN(config.total) ? 1 : parseInt(config.total);
            this.totalRecords = isNaN(config.totalRecords) ? 0 : parseInt(config.totalRecords);
            if (config.pagerid) {
                this.pagerid = config.pagerid;
            }
            if (config.mode) {
                this.mode = config.mode;
            }
            if (config.gopageWrapId) {
                this.gopageWrapId = config.gopageWrapId;
            }
            if (config.gopageButtonId) {
                this.gopageButtonId = config.gopageButtonId;
            }
            if (config.gopageTextboxId) {
                this.gopageTextboxId = config.gopageTextboxId;
            }
            if (config.isShowFirstPageBtn != undefined) {
                this.isShowFirstPageBtn = config.isShowFirstPageBtn;
            }
            if (config.isShowLastPageBtn != undefined) {
                this.isShowLastPageBtn = config.isShowLastPageBtn;
            }
            if (config.isShowPrePageBtn != undefined) {
                this.isShowPrePageBtn = config.isShowPrePageBtn;
            }
            if (config.isShowNextPageBtn != undefined) {
                this.isShowNextPageBtn = config.isShowNextPageBtn;
            }
            if (config.isShowTotalPage != undefined) {
                this.isShowTotalPage = config.isShowTotalPage;
            }
            if (config.isShowTotalRecords != undefined) {
                this.isShowTotalRecords = config.isShowTotalRecords;
            }
            if (config.isGoPage != undefined) {
                this.isGoPage = config.isGoPage;
            }
            if (config.lang) {
                for (var key in config.lang) {
                    this.lang[key] = config.lang[key];
                }
            }
            this.hrefFormer = config.hrefFormer || '';
            this.hrefLatter = config.hrefLatter || '';
            if (config.getLink && typeof(config.getLink) == 'function') {
                this.getLink = config.getLink;
            }
            if (config.click && typeof(config.click) == 'function') {
                this.click = config.click;
            }
            if (config.getHref && typeof(config.getHref) == 'function') {
                this.getHref = config.getHref;
            }


            //validate
            if (this.pno < 1) this.pno = 1;
            this.total = (this.total <= 1) ? 1 : this.total;
            if (this.pno > this.total) this.pno = this.total;
            this.prv = (this.pno <= 2) ? 1 : (this.pno - 1);
            this.next = (this.pno >= this.total - 1) ? this.total : (this.pno + 1);
            this.hasPrv = (this.pno > 1);
            this.hasNext = (this.pno < this.total);
            this.inited = false;
        },
        _getHandlerStr: function (n) {
            if (this.mode == 'click') {
                return 'href="' + this.getHref(n) + '" onclick="return kkpager._clickHandler(' + n + ')"';
            }
            //link模式，也是默认的
            return 'href="' + this.getLink(n) + '"';
        },
        _clickHandler: function (n) {
            var res = false;
            if (this.click && typeof this.click == 'function') {
                res = this.click.call(this, n) || false;
            }
            return res;
        }
    };
    window.kkpager = kkpager;
    // 或者通过 module.exports 提供整个接口
    module.exports = kkpager;
})